home *** CD-ROM | disk | FTP | other *** search
- /****************** LISTING 3 - comm.c ******************/
-
- #include "ipc.h"
-
- ULONG open_comm_link(USHORT *mbxid, ULONG mbxsiz,
- char *mbxname)
- {
- char permanence_flag = TEMPORARY_MBX;
- ULONG protection = WORLD_ACCESS;
- ULONG access_mode = PSL$C_USER;
- $DESCRIPTOR (mbx_logical_name, mbxname);
- mbx_logical_name.dsc$w_length = strlen(mbxname);
-
- return (SYS$CREMBX(permanence_flag, mbxid, mbxsiz, mbxsiz,
- protection, access_mode, &mbx_logical_name));
- }
-
- ULONG close_comm_link(USHORT mbxid)
- {
- return (SYS$DASSGN(mbxid));
- }
-
-
- ULONG send(USHORT mbxid, MSGBUF *msg, int msgsiz)
- {
- int status;
- USHORT func = IO$_WRITEVBLK | IO$M_NOW;
- IO_STATUS_BLOCK iosb = {0, 0, 0};
-
- status = SYS$QIOW(0, mbxid, func, &iosb, 0, 0, msg,
- msgsiz, 0, 0, 0, 0);
-
- return status;
- }
-
-
- ULONG broadcast(MSGBUF *msg, ULONG msgsiz, CLIENT *p)
- {
- while (p) {
- send(p->mbxid, msg, msgsiz);
- p = p->link;
- }
- return SUCCEED;
- }
-
- void receive(USHORT mbxid)
- {
- int status;
- USHORT func = IO$_READVBLK;
-
- extern RCVBUF msgque[QSIZE];
- extern BOOL qfull, qempty, qovrflo;
- extern int qtail, qhead;
-
- if (!qfull) {
- qempty = FALSE;
- qtail = (++qtail) % QSIZE;
- status = SYS$QIO (RCVEF, mbxid, func,
- &msgque[qtail].iosb, &receive,
- mbxid, &msgque[qtail].msg, sizeof(MSGBUF),
- 0, 0, 0, 0);
- if (((qtail+1) % QSIZE) == qhead)
- qfull = TRUE;
- }
- else {
- qovrflo = TRUE;
- }
- }
-